package com.sojson.util.pay.wx;

import java.math.BigDecimal;
import java.util.List;

import com.alipay.api.response.AlipayFundTransOrderQueryResponse;
import com.sojson.base.impl.BaseOrder;
import com.sojson.config.exception.bean.Status;
import com.sojson.util.pay.wx.bean.WxResponseV2;
import com.sojson.util.pay.wx.bean.WxResult;

/**
 * 微信支付工具类接口(V2接口)
 * 
 * @author liu
 * @date 2020-11-02
 */
public interface WxPayV2UtilInterface {

    /** ------------------------------R:必填----------------------------- */
    /** ------------------------------C:一定条件下可选--------------------- */
    /** ------------------------------O:可选----------------------------- */

    /**
     * 调起支付
     * 
     * @param order
     * @param notifyUrl
     * @return
     * @throws Exception
     */
    WxResult payWeb(BaseOrder order, String notifyUrl) throws Exception;

    /**
     * 调起合单支付
     * 
     * @param orders
     * @param notifyUrl
     * @return
     * @throws Exception
     */
    WxResult payMergeWeb(List<? extends BaseOrder> orders, String notifyUrl) throws Exception;

    /**
     * 调起支付
     * 
     * @param order
     * @param notifyUrl
     * @return
     * @throws Exception
     */
    WxResult payApp(BaseOrder order, String notifyUrl) throws Exception;

    /**
     * 调起合单支付
     * 
     * @param orders
     * @param notifyUrl
     * @return
     * @throws Exception
     */
    WxResult payMergeApp(List<? extends BaseOrder> orders, String notifyUrl) throws Exception;

    /**
     * 退款
     * 
     * @param order
     * @param notifyUrl
     * @return
     * @throws Exception
     */
    Status refund(BaseOrder order, String notifyUrl) throws Exception;

    /**
     * 关闭订单
     * 
     * @param orderNo   订单号
     * @return
     * @throws Exception
     */
    Status close(String orderNo) throws Exception;

    /**
     * 关闭订单
     * 
     * @param payNo     微信支付单号
     * @param mchid     商户号
     * @param serialNo  商户 API 证书序列号
     * @return
     * @throws Exception
     */
    Status close(String orderNo, String mchid, String serialNo) throws Exception;

    /**
     * 查询支付订单
     * 
     * @param orderNo   订单号
     * @return
     * @throws Exception
     */
    Status queryByOrderNo(String orderNo) throws Exception;

    /**
     * 查询支付订单
     * 
     * @param payNo     微信支付单号
     * @param mchid     商户号
     * @param serialNo  商户 API 证书序列号
     * @return
     * @throws Exception
     */
    Status queryByOrderNo(String orderNo, String mchid, String serialNo) throws Exception;

    /**
     * 查询支付订单
     * 
     * @param payNo 微信支付单号
     * @return
     * @throws Exception
     */
    Status queryByPayNo(String payNo) throws Exception;

    /**
     * 查询支付订单
     * 
     * @param payNo     微信支付单号
     * @param mchid     商户号
     * @param serialNo  商户 API 证书序列号
     * @return
     * @throws Exception
     */
    Status queryByPayNo(String payNo, String mchid, String serialNo) throws Exception;

    /**
     * 查询退款订单
     * 
     * @param refundNo 退款单号
     * @return
     * @throws Exception
     */
    Status queryRefund(String refundNo) throws Exception;

    /**
     * 查询退款订单
     * 
     * @param refundNo  退款单号
     * @param mchid     商户号
     * @param serialNo  商户 API 证书序列号
     * @return
     * @throws Exception
     */
    Status queryRefund(String refundNo, String mchid, String serialNo) throws Exception;

    /**
     * 单笔转账
     * 
     * @param orderNo   订单号
     * @param total     转账金额
     * @param openid    微信的唯一标识
     * @param name      用户姓名
     * @param title     转账原因
     * @return
     * @throws Exception
     */
    WxResponseV2 withdrawDeposit(String orderNo, BigDecimal total, String openid, String name, String title)
        throws Exception;

    /**
     * 单笔转账
     * 
     * @param orderNo   订单号
     * @param mchid     商户号
     * @param mchKey    微信商户密钥(API密钥)
     * @param appid     Appid
     * @param total     转账金额
     * @param openid    微信的唯一标识
     * @param name      用户姓名
     * @param title     转账原因
     * @return
     * @throws Exception
     */
    WxResponseV2 withdrawDeposit(String orderNo, String mchid, String mchKey, String appid, BigDecimal total,
        String openid, String name, String title) throws Exception;

    /**
     * 获取接口调用结果
     * 
     * @param res
     * @return
     */
    Status getStatus(WxResponseV2 res);

    /**
     * 查询转账订单
     * 
     * @param orderNo 商户订单号
     * @return
     * @throws Exception
     */
    AlipayFundTransOrderQueryResponse query(String orderNo) throws Exception;

}